﻿<?php
include('class.db.php');

class Login{
	private $_id;
	private $_username;
	private $_password;
	private $_passmd5;
	public $errors;
	private $_access;
	private $_login;
	private $_token;
	
	public function __construct(){
		/*
		eerst variabelen definiëren:
		errors -> in deze array worden alle errors opgeslagen
		login -> als er op de Log in button geklikt wordt
		access -> status toegang; 0 als de gebruiker nog geen toegang heeft, 1 als er toegang wordt gegeven
		token -> wordt opgehaald uit de login.php, waar de token als een random md5 aangemaakt wordt -zie net boven "<DOCTYPE ..."
		id -> wordt initieel op 0 gezet en later in de functie "verifyDatabase" ingevuld
		*/
		$this->errors	= array();
		$this->_login	= isset($_POST["login"]);
		$this->_access	= 0;
		$this->_token	= $_POST["token"];
		$this->_id		= 0;
		
		/* Als er op "Log in" geklikt wordt, wordt username en password opgehaald en wordt het password ge-encrypteerd */
		
				
		if($this->_login){$this->_username = $this->filter($_POST["username"]);}
		else{$this->_username = $_SESSION["username"];}
		
		if($this->_login){$this->_password = $this->filter($_POST["password"]);}
		else{$this->_password = "";}
		
		if($this->_login){$this->_passmd5 = md5($this->_password);}
		else{$this->_passmd5 = $_SESSION["password"];}
		
		// debug
		//print ("<p>".$this->_username. " " . $this->_passmd5 . "</p>");
	}
	
	public function isLoggedIn(){
		/* Als er op "Log in" geklikt is, wordt de invoer gecontroleerd. Indien er geen login gebeurd is, wordt gecheckt of de sessie 	
		al opgestart was. Adhv het resultaat daarvan wordt gereturnt of er toegang kan verleend worden. */
		if($this->_login){$this->verifyPost();}
		else{$this->verifySession();}
		
		return $this->_access;
	}
	
	public function filter($var){
		/* In deze functie worden alle vreemde tekens verwijderd */
		return preg_replace("/[^a-zA-Z0-9]/","",$var);
	}
	
	public function verifyPost(){
		/* De invoer wordt gecontroleerd */
		try{
			if(!$this->isTokenValid()){throw new Exception("Invalid form submission");}
			if(!$this->isDataValid()){throw new Exception("Invalid form data");}
			if(!$this->verifyDatabase()){throw new Exception("Invalid username/password");}
			/* Indien bovenstaande functies (if's) geen errors gaven, wordt toegang verleend en wordt de sessie geregistreerd */
			$this->_access = 1;
			$this->registerSession();
		}
		catch(Exception $e){
			$this->errors[]=$e->getMessage(); //indien bovenstaande functies (if's) wel errors gaven, schrijf deze dan weg in de array
		}
	}
	
	public function verifySession(){
		if($this->sessionExist() && $this->verifyDatabase()){$this->_access = 1;} /* Als er al een sessie gestart is (dus als 
		$_SESSION["username"] en $_SESSION["password"] ingevuld zijn), wordt toegang verleend */
	}
	
	public function verifyDatabase(){
		$db = new db();
		$sql = "SELECT id FROM users WHERE username = '$this->_username' AND password = '$this->_passmd5'";
		$database = "vdab";
		
		$result = $db->query($database, $sql);
		if(mysql_num_rows($result) == 1){
			$row = mysql_fetch_assoc($result);
			$this->_id = $row["id"]; //id van een record wordt gedefinieerd
			
			return true;
		}
		else{
			return false;
		}
	}
	
	public function isDataValid(){
		if(preg_match("/^[a-z.]+$/", $this->_username) && preg_match("/^[a-zA-Z0-9]{3,5}$/", $this->_password)){
			return true;
		}
		else{
			return false;
		}
	}
	
	public function isTokenValid(){
		/* Indien er geen token aangemaakt is, of indien er geen token in de $_SESSION ingevuld staat, wordt false gereturnt, 
		anders true */
		if(!isset($_SESSION["token"]) || $this->_token != $_SESSION["token"]){
			return false;
		}
		else{
			return true;
		}
	}
	
	public function registerSession(){
		/* id, username en password worden opgevuld voor deze sessie*/
		$_SESSION["ID"] = $this->_id;
		$_SESSION["username"] = $this->_username;
		$_SESSION["password"] = $this->_passmd5;
	}
	
	public function sessionExist(){
		/* indien username en password voor deze sessie opgevuld zijn, is er dus een sessie opgestart/ bestaat de sessie */
		if(isset($_SESSION["username"]) && isset($_SESSION["password"])){
			return true;
		}
		else{
			return false;
		}
	}
	
	public function showErrors(){
		echo "Errors:<br>";
		/* de errors worden onder elkaar opgelijst en op de pagina getoond */
		foreach ($this->_errors as $key=>$value){
			echo $value."<br>";
		}
	}
}
?>